(0) Obligation:

JBC Problem based on JBC Program:
No human-readable program information known.

Manifest-Version: 1.0 Created-By: 1.6.0_16 (Sun Microsystems Inc.) Main-Class: CountUpRound

(1) JBC2FIG (SOUND transformation)

Constructed FIGraph.

(2) Obligation:

FIGraph based on JBC Program:
Graph of 178 nodes with 1 SCC.

(3) FIGtoITRSProof (SOUND transformation)

Transformed FIGraph to ITRS rules

(4) Obligation:

ITRS problem:

The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean

The TRS R consists of the following rules:
Load346(i7, i31) → Cond_Load346(i31 >= 0 && i7 > i31, i7, i31)
Cond_Load346(TRUE, i7, i31) → Store528(i7, i31 + 1 + 1)
Store528(i7, i47) → Load346(i7, i47)
Load346(i7, i31) → Cond_Load3461(i31 >= 0 && i7 > i31 && 0 = i31 + 1 % 2, i7, i31)
Cond_Load3461(TRUE, i7, i31) → Load346(i7, i31 + 1)
The set Q consists of the following terms:
Load346(x0, x1)
Cond_Load346(TRUE, x0, x1)
Store528(x0, x1)
Cond_Load3461(TRUE, x0, x1)

(5) ITRStoIDPProof (EQUIVALENT transformation)

Added dependency pairs

(6) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Boolean, Integer


The ITRS R consists of the following rules:
Load346(i7, i31) → Cond_Load346(i31 >= 0 && i7 > i31, i7, i31)
Cond_Load346(TRUE, i7, i31) → Store528(i7, i31 + 1 + 1)
Store528(i7, i47) → Load346(i7, i47)
Load346(i7, i31) → Cond_Load3461(i31 >= 0 && i7 > i31 && 0 = i31 + 1 % 2, i7, i31)
Cond_Load3461(TRUE, i7, i31) → Load346(i7, i31 + 1)

The integer pair graph contains the following rules and edges:
(0): LOAD346(i7[0], i31[0]) → COND_LOAD346(i31[0] >= 0 && i7[0] > i31[0], i7[0], i31[0])
(1): COND_LOAD346(TRUE, i7[1], i31[1]) → STORE528(i7[1], i31[1] + 1 + 1)
(2): STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2])
(3): LOAD346(i7[3], i31[3]) → COND_LOAD3461(i31[3] >= 0 && i7[3] > i31[3] && 0 = i31[3] + 1 % 2, i7[3], i31[3])
(4): COND_LOAD3461(TRUE, i7[4], i31[4]) → LOAD346(i7[4], i31[4] + 1)

(0) -> (1), if ((i31[0] >= 0 && i7[0] > i31[0]* TRUE)∧(i7[0]* i7[1])∧(i31[0]* i31[1]))


(1) -> (2), if ((i31[1] + 1 + 1* i47[2])∧(i7[1]* i7[2]))


(2) -> (0), if ((i7[2]* i7[0])∧(i47[2]* i31[0]))


(2) -> (3), if ((i7[2]* i7[3])∧(i47[2]* i31[3]))


(3) -> (4), if ((i31[3] >= 0 && i7[3] > i31[3] && 0 = i31[3] + 1 % 2* TRUE)∧(i7[3]* i7[4])∧(i31[3]* i31[4]))


(4) -> (0), if ((i31[4] + 1* i31[0])∧(i7[4]* i7[0]))


(4) -> (3), if ((i31[4] + 1* i31[3])∧(i7[4]* i7[3]))



The set Q consists of the following terms:
Load346(x0, x1)
Cond_Load346(TRUE, x0, x1)
Store528(x0, x1)
Cond_Load3461(TRUE, x0, x1)

(7) UsableRulesProof (EQUIVALENT transformation)

As all Q-normal forms are R-normal forms we are in the innermost case. Hence, by the usable rules processor [LPAR04] we can delete all non-usable rules [FROCOS05] from R.

(8) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(0): LOAD346(i7[0], i31[0]) → COND_LOAD346(i31[0] >= 0 && i7[0] > i31[0], i7[0], i31[0])
(1): COND_LOAD346(TRUE, i7[1], i31[1]) → STORE528(i7[1], i31[1] + 1 + 1)
(2): STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2])
(3): LOAD346(i7[3], i31[3]) → COND_LOAD3461(i31[3] >= 0 && i7[3] > i31[3] && 0 = i31[3] + 1 % 2, i7[3], i31[3])
(4): COND_LOAD3461(TRUE, i7[4], i31[4]) → LOAD346(i7[4], i31[4] + 1)

(0) -> (1), if ((i31[0] >= 0 && i7[0] > i31[0]* TRUE)∧(i7[0]* i7[1])∧(i31[0]* i31[1]))


(1) -> (2), if ((i31[1] + 1 + 1* i47[2])∧(i7[1]* i7[2]))


(2) -> (0), if ((i7[2]* i7[0])∧(i47[2]* i31[0]))


(2) -> (3), if ((i7[2]* i7[3])∧(i47[2]* i31[3]))


(3) -> (4), if ((i31[3] >= 0 && i7[3] > i31[3] && 0 = i31[3] + 1 % 2* TRUE)∧(i7[3]* i7[4])∧(i31[3]* i31[4]))


(4) -> (0), if ((i31[4] + 1* i31[0])∧(i7[4]* i7[0]))


(4) -> (3), if ((i31[4] + 1* i31[3])∧(i7[4]* i7[3]))



The set Q consists of the following terms:
Load346(x0, x1)
Cond_Load346(TRUE, x0, x1)
Store528(x0, x1)
Cond_Load3461(TRUE, x0, x1)

(9) IDPNonInfProof (SOUND transformation)

The constraints were generated the following way:
The DP Problem is simplified using the Induction Calculus [NONINF] with the following steps:
Note that final constraints are written in bold face.


For Pair LOAD346(i7, i31) → COND_LOAD346(&&(>=(i31, 0), >(i7, i31)), i7, i31) the following chains were created:
  • We consider the chain LOAD346(i7[0], i31[0]) → COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0]), COND_LOAD346(TRUE, i7[1], i31[1]) → STORE528(i7[1], +(+(i31[1], 1), 1)) which results in the following constraint:

    (1)    (&&(>=(i31[0], 0), >(i7[0], i31[0]))=TRUEi7[0]=i7[1]i31[0]=i31[1]LOAD346(i7[0], i31[0])≥NonInfC∧LOAD346(i7[0], i31[0])≥COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])∧(UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥))



    We simplified constraint (1) using rules (IV), (IDP_BOOLEAN) which results in the following new constraint:

    (2)    (>=(i31[0], 0)=TRUE>(i7[0], i31[0])=TRUELOAD346(i7[0], i31[0])≥NonInfC∧LOAD346(i7[0], i31[0])≥COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])∧(UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥))



    We simplified constraint (2) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (3)    (i31[0] ≥ 0∧i7[0] + [-1] + [-1]i31[0] ≥ 0 ⇒ (UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥)∧[(2)bni_14 + (-1)Bound*bni_14] + [bni_14]i7[0] + [(-1)bni_14]i31[0] ≥ 0∧[1 + (-1)bso_15] ≥ 0)



    We simplified constraint (3) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (4)    (i31[0] ≥ 0∧i7[0] + [-1] + [-1]i31[0] ≥ 0 ⇒ (UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥)∧[(2)bni_14 + (-1)Bound*bni_14] + [bni_14]i7[0] + [(-1)bni_14]i31[0] ≥ 0∧[1 + (-1)bso_15] ≥ 0)



    We simplified constraint (4) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (5)    (i31[0] ≥ 0∧i7[0] + [-1] + [-1]i31[0] ≥ 0 ⇒ (UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥)∧[(2)bni_14 + (-1)Bound*bni_14] + [bni_14]i7[0] + [(-1)bni_14]i31[0] ≥ 0∧[1 + (-1)bso_15] ≥ 0)



    We simplified constraint (5) using rule (IDP_SMT_SPLIT) which results in the following new constraint:

    (6)    (i31[0] ≥ 0∧i7[0] ≥ 0 ⇒ (UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥)∧[(3)bni_14 + (-1)Bound*bni_14] + [bni_14]i7[0] ≥ 0∧[1 + (-1)bso_15] ≥ 0)







For Pair COND_LOAD346(TRUE, i7, i31) → STORE528(i7, +(+(i31, 1), 1)) the following chains were created:
  • We consider the chain COND_LOAD346(TRUE, i7[1], i31[1]) → STORE528(i7[1], +(+(i31[1], 1), 1)) which results in the following constraint:

    (7)    (COND_LOAD346(TRUE, i7[1], i31[1])≥NonInfC∧COND_LOAD346(TRUE, i7[1], i31[1])≥STORE528(i7[1], +(+(i31[1], 1), 1))∧(UIncreasing(STORE528(i7[1], +(+(i31[1], 1), 1))), ≥))



    We simplified constraint (7) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (8)    ((UIncreasing(STORE528(i7[1], +(+(i31[1], 1), 1))), ≥)∧[1 + (-1)bso_17] ≥ 0)



    We simplified constraint (8) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (9)    ((UIncreasing(STORE528(i7[1], +(+(i31[1], 1), 1))), ≥)∧[1 + (-1)bso_17] ≥ 0)



    We simplified constraint (9) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (10)    ((UIncreasing(STORE528(i7[1], +(+(i31[1], 1), 1))), ≥)∧[1 + (-1)bso_17] ≥ 0)



    We simplified constraint (10) using rule (IDP_UNRESTRICTED_VARS) which results in the following new constraint:

    (11)    ((UIncreasing(STORE528(i7[1], +(+(i31[1], 1), 1))), ≥)∧0 = 0∧0 = 0∧[1 + (-1)bso_17] ≥ 0)







For Pair STORE528(i7, i47) → LOAD346(i7, i47) the following chains were created:
  • We consider the chain STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2]), LOAD346(i7[0], i31[0]) → COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0]) which results in the following constraint:

    (12)    (i7[2]=i7[0]i47[2]=i31[0]STORE528(i7[2], i47[2])≥NonInfC∧STORE528(i7[2], i47[2])≥LOAD346(i7[2], i47[2])∧(UIncreasing(LOAD346(i7[2], i47[2])), ≥))



    We simplified constraint (12) using rule (IV) which results in the following new constraint:

    (13)    (STORE528(i7[2], i47[2])≥NonInfC∧STORE528(i7[2], i47[2])≥LOAD346(i7[2], i47[2])∧(UIncreasing(LOAD346(i7[2], i47[2])), ≥))



    We simplified constraint (13) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (14)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧[(-1)bso_19] ≥ 0)



    We simplified constraint (14) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (15)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧[(-1)bso_19] ≥ 0)



    We simplified constraint (15) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (16)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧[(-1)bso_19] ≥ 0)



    We simplified constraint (16) using rule (IDP_UNRESTRICTED_VARS) which results in the following new constraint:

    (17)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧0 = 0∧0 = 0∧[(-1)bso_19] ≥ 0)



  • We consider the chain STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2]), LOAD346(i7[3], i31[3]) → COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3]) which results in the following constraint:

    (18)    (i7[2]=i7[3]i47[2]=i31[3]STORE528(i7[2], i47[2])≥NonInfC∧STORE528(i7[2], i47[2])≥LOAD346(i7[2], i47[2])∧(UIncreasing(LOAD346(i7[2], i47[2])), ≥))



    We simplified constraint (18) using rule (IV) which results in the following new constraint:

    (19)    (STORE528(i7[2], i47[2])≥NonInfC∧STORE528(i7[2], i47[2])≥LOAD346(i7[2], i47[2])∧(UIncreasing(LOAD346(i7[2], i47[2])), ≥))



    We simplified constraint (19) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (20)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧[(-1)bso_19] ≥ 0)



    We simplified constraint (20) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (21)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧[(-1)bso_19] ≥ 0)



    We simplified constraint (21) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (22)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧[(-1)bso_19] ≥ 0)



    We simplified constraint (22) using rule (IDP_UNRESTRICTED_VARS) which results in the following new constraint:

    (23)    ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧0 = 0∧0 = 0∧[(-1)bso_19] ≥ 0)







For Pair LOAD346(i7, i31) → COND_LOAD3461(&&(&&(>=(i31, 0), >(i7, i31)), =(0, %(+(i31, 1), 2))), i7, i31) the following chains were created:
  • We consider the chain LOAD346(i7[3], i31[3]) → COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3]), COND_LOAD3461(TRUE, i7[4], i31[4]) → LOAD346(i7[4], +(i31[4], 1)) which results in the following constraint:

    (24)    (&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2)))=TRUEi7[3]=i7[4]i31[3]=i31[4]LOAD346(i7[3], i31[3])≥NonInfC∧LOAD346(i7[3], i31[3])≥COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])∧(UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥))



    We simplified constraint (24) using rules (IV), (IDP_BOOLEAN) which results in the following new constraint:

    (25)    (>=(i31[3], 0)=TRUE>(i7[3], i31[3])=TRUE>=(0, %(+(i31[3], 1), 2))=TRUE<=(0, %(+(i31[3], 1), 2))=TRUELOAD346(i7[3], i31[3])≥NonInfC∧LOAD346(i7[3], i31[3])≥COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])∧(UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥))



    We simplified constraint (25) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (26)    (i31[3] ≥ 0∧i7[3] + [-1] + [-1]i31[3] ≥ 0∧[-1]min{[2], [-2]} ≥ 0∧max{[2], [-2]} ≥ 0 ⇒ (UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥)∧[(2)bni_20 + (-1)Bound*bni_20] + [bni_20]i7[3] + [(-1)bni_20]i31[3] ≥ 0∧[(-1)bso_21] ≥ 0)



    We simplified constraint (26) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (27)    (i31[3] ≥ 0∧i7[3] + [-1] + [-1]i31[3] ≥ 0∧[-1]min{[2], [-2]} ≥ 0∧max{[2], [-2]} ≥ 0 ⇒ (UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥)∧[(2)bni_20 + (-1)Bound*bni_20] + [bni_20]i7[3] + [(-1)bni_20]i31[3] ≥ 0∧[(-1)bso_21] ≥ 0)



    We simplified constraint (27) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (28)    (i31[3] ≥ 0∧i7[3] + [-1] + [-1]i31[3] ≥ 0∧[4] ≥ 0∧[2] ≥ 0∧[2] ≥ 0 ⇒ (UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥)∧[(2)bni_20 + (-1)Bound*bni_20] + [bni_20]i7[3] + [(-1)bni_20]i31[3] ≥ 0∧[(-1)bso_21] ≥ 0)



    We simplified constraint (28) using rule (IDP_SMT_SPLIT) which results in the following new constraint:

    (29)    (i31[3] ≥ 0∧i7[3] ≥ 0∧[4] ≥ 0∧[2] ≥ 0∧[2] ≥ 0 ⇒ (UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥)∧[(3)bni_20 + (-1)Bound*bni_20] + [bni_20]i7[3] ≥ 0∧[(-1)bso_21] ≥ 0)



    We simplified constraint (29) using rule (IDP_POLY_GCD) which results in the following new constraint:

    (30)    (i31[3] ≥ 0∧i7[3] ≥ 0∧[1] ≥ 0∧[1] ≥ 0∧[1] ≥ 0 ⇒ (UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥)∧[(3)bni_20 + (-1)Bound*bni_20] + [bni_20]i7[3] ≥ 0∧[(-1)bso_21] ≥ 0)







For Pair COND_LOAD3461(TRUE, i7, i31) → LOAD346(i7, +(i31, 1)) the following chains were created:
  • We consider the chain COND_LOAD3461(TRUE, i7[4], i31[4]) → LOAD346(i7[4], +(i31[4], 1)) which results in the following constraint:

    (31)    (COND_LOAD3461(TRUE, i7[4], i31[4])≥NonInfC∧COND_LOAD3461(TRUE, i7[4], i31[4])≥LOAD346(i7[4], +(i31[4], 1))∧(UIncreasing(LOAD346(i7[4], +(i31[4], 1))), ≥))



    We simplified constraint (31) using rule (POLY_CONSTRAINTS) which results in the following new constraint:

    (32)    ((UIncreasing(LOAD346(i7[4], +(i31[4], 1))), ≥)∧[1 + (-1)bso_23] ≥ 0)



    We simplified constraint (32) using rule (IDP_POLY_SIMPLIFY) which results in the following new constraint:

    (33)    ((UIncreasing(LOAD346(i7[4], +(i31[4], 1))), ≥)∧[1 + (-1)bso_23] ≥ 0)



    We simplified constraint (33) using rule (POLY_REMOVE_MIN_MAX) which results in the following new constraint:

    (34)    ((UIncreasing(LOAD346(i7[4], +(i31[4], 1))), ≥)∧[1 + (-1)bso_23] ≥ 0)



    We simplified constraint (34) using rule (IDP_UNRESTRICTED_VARS) which results in the following new constraint:

    (35)    ((UIncreasing(LOAD346(i7[4], +(i31[4], 1))), ≥)∧0 = 0∧0 = 0∧[1 + (-1)bso_23] ≥ 0)







To summarize, we get the following constraints P for the following pairs.
  • LOAD346(i7, i31) → COND_LOAD346(&&(>=(i31, 0), >(i7, i31)), i7, i31)
    • (i31[0] ≥ 0∧i7[0] ≥ 0 ⇒ (UIncreasing(COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])), ≥)∧[(3)bni_14 + (-1)Bound*bni_14] + [bni_14]i7[0] ≥ 0∧[1 + (-1)bso_15] ≥ 0)

  • COND_LOAD346(TRUE, i7, i31) → STORE528(i7, +(+(i31, 1), 1))
    • ((UIncreasing(STORE528(i7[1], +(+(i31[1], 1), 1))), ≥)∧0 = 0∧0 = 0∧[1 + (-1)bso_17] ≥ 0)

  • STORE528(i7, i47) → LOAD346(i7, i47)
    • ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧0 = 0∧0 = 0∧[(-1)bso_19] ≥ 0)
    • ((UIncreasing(LOAD346(i7[2], i47[2])), ≥)∧0 = 0∧0 = 0∧[(-1)bso_19] ≥ 0)

  • LOAD346(i7, i31) → COND_LOAD3461(&&(&&(>=(i31, 0), >(i7, i31)), =(0, %(+(i31, 1), 2))), i7, i31)
    • (i31[3] ≥ 0∧i7[3] ≥ 0∧[1] ≥ 0∧[1] ≥ 0∧[1] ≥ 0 ⇒ (UIncreasing(COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])), ≥)∧[(3)bni_20 + (-1)Bound*bni_20] + [bni_20]i7[3] ≥ 0∧[(-1)bso_21] ≥ 0)

  • COND_LOAD3461(TRUE, i7, i31) → LOAD346(i7, +(i31, 1))
    • ((UIncreasing(LOAD346(i7[4], +(i31[4], 1))), ≥)∧0 = 0∧0 = 0∧[1 + (-1)bso_23] ≥ 0)




The constraints for P> respective Pbound are constructed from P where we just replace every occurence of "t ≥ s" in P by "t > s" respective "t ≥ c". Here c stands for the fresh constant used for Pbound.
Using the following integer polynomial ordering the resulting constraints can be solved
Polynomial interpretation over integers[POLO]:

POL(TRUE) = 0   
POL(FALSE) = 0   
POL(LOAD346(x1, x2)) = [2] + x1 + [-1]x2   
POL(COND_LOAD346(x1, x2, x3)) = [1] + x2 + [-1]x3   
POL(&&(x1, x2)) = [-1]   
POL(>=(x1, x2)) = [-1]   
POL(0) = 0   
POL(>(x1, x2)) = [-1]   
POL(STORE528(x1, x2)) = [2] + [-1]x2 + x1   
POL(+(x1, x2)) = x1 + x2   
POL(1) = [1]   
POL(COND_LOAD3461(x1, x2, x3)) = [2] + [-1]x3 + x2   
POL(=(x1, x2)) = [-1]   
POL(2) = [2]   

Polynomial Interpretations with Context Sensitive Arithemetic Replacement
POL(TermCSAR-Mode @ Context)

POL(%(x1, 2)-1 @ {}) = min{x2, [-1]x2}   
POL(%(x1, 2)1 @ {}) = max{x2, [-1]x2}   

The following pairs are in P>:

LOAD346(i7[0], i31[0]) → COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])
COND_LOAD346(TRUE, i7[1], i31[1]) → STORE528(i7[1], +(+(i31[1], 1), 1))
COND_LOAD3461(TRUE, i7[4], i31[4]) → LOAD346(i7[4], +(i31[4], 1))

The following pairs are in Pbound:

LOAD346(i7[0], i31[0]) → COND_LOAD346(&&(>=(i31[0], 0), >(i7[0], i31[0])), i7[0], i31[0])
LOAD346(i7[3], i31[3]) → COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])

The following pairs are in P:

STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2])
LOAD346(i7[3], i31[3]) → COND_LOAD3461(&&(&&(>=(i31[3], 0), >(i7[3], i31[3])), =(0, %(+(i31[3], 1), 2))), i7[3], i31[3])

There are no usable rules.

(10) Complex Obligation (AND)

(11) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Boolean, Integer


R is empty.

The integer pair graph contains the following rules and edges:
(2): STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2])
(3): LOAD346(i7[3], i31[3]) → COND_LOAD3461(i31[3] >= 0 && i7[3] > i31[3] && 0 = i31[3] + 1 % 2, i7[3], i31[3])

(2) -> (3), if ((i7[2]* i7[3])∧(i47[2]* i31[3]))



The set Q consists of the following terms:
Load346(x0, x1)
Cond_Load346(TRUE, x0, x1)
Store528(x0, x1)
Cond_Load3461(TRUE, x0, x1)

(12) IDependencyGraphProof (EQUIVALENT transformation)

The approximation of the Dependency Graph [LPAR04,FROCOS05,EDGSTAR] contains 0 SCCs with 2 less nodes.

(13) TRUE

(14) Obligation:

IDP problem:
The following function symbols are pre-defined:
!=~Neq: (Integer, Integer) -> Boolean
*~Mul: (Integer, Integer) -> Integer
>=~Ge: (Integer, Integer) -> Boolean
-1~UnaryMinus: (Integer) -> Integer
|~Bwor: (Integer, Integer) -> Integer
/~Div: (Integer, Integer) -> Integer
=~Eq: (Integer, Integer) -> Boolean
~Bwxor: (Integer, Integer) -> Integer
||~Lor: (Boolean, Boolean) -> Boolean
!~Lnot: (Boolean) -> Boolean
<~Lt: (Integer, Integer) -> Boolean
-~Sub: (Integer, Integer) -> Integer
<=~Le: (Integer, Integer) -> Boolean
>~Gt: (Integer, Integer) -> Boolean
~~Bwnot: (Integer) -> Integer
%~Mod: (Integer, Integer) -> Integer
&~Bwand: (Integer, Integer) -> Integer
+~Add: (Integer, Integer) -> Integer
&&~Land: (Boolean, Boolean) -> Boolean


The following domains are used:

Integer


R is empty.

The integer pair graph contains the following rules and edges:
(1): COND_LOAD346(TRUE, i7[1], i31[1]) → STORE528(i7[1], i31[1] + 1 + 1)
(2): STORE528(i7[2], i47[2]) → LOAD346(i7[2], i47[2])
(4): COND_LOAD3461(TRUE, i7[4], i31[4]) → LOAD346(i7[4], i31[4] + 1)

(1) -> (2), if ((i31[1] + 1 + 1* i47[2])∧(i7[1]* i7[2]))



The set Q consists of the following terms:
Load346(x0, x1)
Cond_Load346(TRUE, x0, x1)
Store528(x0, x1)
Cond_Load3461(TRUE, x0, x1)

(15) IDependencyGraphProof (EQUIVALENT transformation)

The approximation of the Dependency Graph [LPAR04,FROCOS05,EDGSTAR] contains 0 SCCs with 3 less nodes.

(16) TRUE